<?php
use think\Config;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

function removeAllBracketsContent($str) {
    // 1. 先将所有换行符转换为空格
    $str = str_replace(["\r\n", "\r", "\n"], ' ', $str);
    
    // 2. 匹配多种括号，且括号内只包含数字（可包含正负号和小数点）
    $pattern = '/(【[+-]?\d+(\.\d+)?】|\([+-]?\d+(\.\d+)?\)|\[[+-]?\d+(\.\d+)?\]|\{[+-]?\d+(\.\d+)?\}|〈[+-]?\d+(\.\d+)?〉|《[+-]?\d+(\.\d+)?》|「[+-]?\d+(\.\d+)?」|『[+-]?\d+(\.\d+)?』|〖[+-]?\d+(\.\d+)?〗|〘[+-]?\d+(\.\d+)?〙)/u';
    
    // 3. 替换匹配到的内容为空字符串
    $str = preg_replace($pattern, '', $str);
    
    // 4. 可选：去除多余的连续空格（将多个空格合并为一个）
    $str = preg_replace('/\s+/', ' ', $str);
    
    return trim($str);
}

function update_llm_text_lastest_section($content){
    // 讀取llms.txt文件
    $file_path = ROOT_PATH . 'public/llms.txt';
    if (!file_exists($file_path)) {
        return false;
    }
    
    $file_content = file_get_contents($file_path);
    // 查找"## 最新更新内容"部分
    $section_start = strpos($file_content, '## 最新更新内容');
    if ($section_start === false) {
        // 如果找不到該部分，則將其添加到文件末尾
        $file_content .= "\n## 最新更新内容\n";
        $section_start = strpos($file_content, '## 最新更新内容');
    }
    
    
    
    // 構建新的內容
    $new_section_content = "## 最新更新内容\n";
    if (!empty($content) && is_array($content)) {
        foreach ($content as $item) {
            if (isset($item['title']) && isset($item['des']) && isset($item['url'])) {
                $new_section_content .= "### [{$item['title']}]({$item['url']})\n";
                $new_section_content .= "{$item['des']}\n";
            }
        }
    }
    // 替換原有內容
    $file_content = substr($file_content, 0, $section_start) . $new_section_content ;
    
    // 寫入文件，確保使用UTF-8編碼
    return file_put_contents($file_path, $file_content);
}
/**
 * 保存二进制图片数据到本地文件
 * @param string $binary_data 二进制图片数据
 * @param string $format 图片格式(如 .jpg, .png)
 * @return string|bool 成功返回保存的文件路径,失败返回false
 */
function save_binary_image($binary_data, $format = '.png') {
    try {
        // 生成唯一文件名
        $filename = uniqid() . $format;
        
        // 构建保存路径 
        $dest = 'res/' . date('Y').'/'.date('m').'/'.date('d').'/'.$filename;
        
        // 创建目录
        $dir = dirname($dest);
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
            chown($dir, 'www');
            chgrp($dir, 'www');
        }
        
        // 写入文件
        if (file_put_contents($dest, $binary_data)) {
            return $dest;
        }
        
        return false;
        
    } catch (\Exception $e) {
        return false;
    }
}

function debug_dump(...$vars){
    foreach($vars as $var) {
        var_dump($var);
    }
    exit;
}

function str_replace_limit($search, $replace, $subject, $limit=-1) {
// constructing mask(s)...
if (is_array($search)) {
foreach ($search as $k=>$v) {
$search[$k] = '`' . preg_quote($search[$k],'`') . '`';
}
}
else {
$search = '`' . preg_quote($search,'`') . '`';
}
// replacement
return preg_replace($search, $replace, $subject, $limit);
}


    
function get_client_ip($validate = true) {
    $ip = '';
    
    // 检查各种可能的服务器变量
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // 可能有多个IP，取第一个
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($ips[0]);
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED'];
    } elseif (!empty($_SERVER['HTTP_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_FORWARDED_FOR'];
    } elseif (!empty($_SERVER['HTTP_FORWARDED'])) {
        $ip = $_SERVER['HTTP_FORWARDED'];
    } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
    // 验证IP地址
    if ($validate && !empty($ip)) {
        // 验证IPv4地址
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            return $ip;
        }
        
        // 验证IPv6地址
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
            return $ip;
        }
        
        // 如果都不是有效IP，返回服务器IP
        return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
    }
    
    return $ip ?: '0.0.0.0';
}

function sitemap($pages) {
    $xml = '<?xml version="1.0" encoding="UTF-8"?>'. PHP_EOL;
    $xml.= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'. PHP_EOL;

    foreach ($pages as $page) {
        $xml.= '<url>'. PHP_EOL;
        $xml.= '<loc>'. $page['uri']. '</loc>'. PHP_EOL;
        $xml.= '<lastmod>'. $page['date']. '</lastmod>'. PHP_EOL;
        $xml.= '</url>'. PHP_EOL;
    }

    $xml.= '</urlset>';
  
    $file_name = 'sitemap.xml';

    $file_path = $file_name;
    //var_dump($file_path,$xml);exit;
    file_put_contents($file_path, $xml);
    echo "Sitemap generated successfully! {$file_path}\n";
}

function curl_post_bing( $url, $postdata ,$cookies = '') {
    $header = array(
      'Content-Type: application/json;charset=UTF-8'
    );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE );
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE );
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($curl, CURLOPT_COOKIE, $cookies);
    $data = curl_exec($curl);
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    //var_dump(curl_getinfo($curl));
     if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
    } else {
        curl_close($curl);
        return [$statusCode,$data];
    }
}
function indexnow($site_domain,$url_list,$key){
    $request_url = 'https://api.indexnow.org/IndexNow';

    $post_data = [
        'host'=> $site_domain,
        'key' => $key,
        'keyLocation' => "https://{$site_domain}/{$key}.txt",
        'urlList' => $url_list,
    ];
    $post_data = json_encode($post_data);
    list($statusCode,$result) = curl_post_bing($request_url,$post_data);
    //var_dump($post_data,$statusCode,$result);exit;
    $date = date('Y-m-d H:i:s');
    file_put_contents("indexnoew.log","[{$date}] {$statusCode} {$result} ".json_encode($url_list)."\n",FILE_APPEND);
}

/**
 * 上传文件到指定目录
 * @param \think\file\UploadedFile $file 上传的文件对象
 * @param array $validate 验证规则 ['size'=>文件大小,'ext'=>'允许的扩展名']
 * @return array ['success'=>bool, 'message'=>string, 'path'=>string]
 */
function upload_file($file, $validate = [])
{
    try {
        // 默认验证规则
        $default_validate = [
            'size' => 5242880, // 5MB
            'ext' => 'jpg,jpeg,png,gif'
        ];
        $validate = array_merge($default_validate, $validate);
        
        // 验证文件
        if ($file->getSize() > $validate['size']) {
            return [
                'success' => false,
                'message' => '文件大小不能超过' . ($validate['size'] / 1024 / 1024) . 'MB'
            ];
        }
        
        $ext = strtolower($file->getOriginalExtension());
        if (!in_array($ext, explode(',', $validate['ext']))) {
            return [
                'success' => false,
                'message' => '只允许上传' . $validate['ext'] . '格式的文件'
            ];
        }
        
        // 生成文件名
        $savename = md5(uniqid(mt_rand(), true)) . '.' . $ext;
        
        // 确保目录存在
        $base_dir = 'res';
        $references_dir = 'references/' .date('Y').'/'.date('m').'/'.date('d');
        $upload_dir = $base_dir . '/' . $references_dir;
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, 0755, true);
        }
        
        // 移动文件
        $file->move($upload_dir, $savename);
        
        return [
            'success' => true,
            'message' => '上传成功',
            'references_url' => $upload_dir . '/' . $savename
        ];
    } catch (\Exception $e) {
        return [
            'success' => false,
            'message' => '上传失败：' . $e->getMessage()
        ];
    }
}

/**
 * 保存base64图片数据到本地文件
 * @param string $base64_data base64图片数据
 * @param string $format 图片格式(如 .jpg, .png)
 * @return string|bool 成功返回保存的文件路径,失败返回false
 */
function save_base64_image($base64_data, $format = '.png') {
    try {
        // 移除base64头部信息
        if (strpos($base64_data, 'data:image') !== false) {
            $base64_data = preg_replace('/^data:image\/\w+;base64,/', '', $base64_data);
        }
        
        // 解码base64数据
        $binary_data = base64_decode($base64_data);
        if ($binary_data === false) {
            return false;
        }
        
        // 生成唯一文件名
        $filename = uniqid() . $format;
        
        // 构建保存路径
        $base_dir = 'res';
        $image_path = '/' .date('Y').'/'.date('m').'/'.date('d').'/'.$filename;
        $dest = $base_dir  . $image_path;
        
        // 创建目录
        $dir = dirname($dest);
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
            chown($dir, 'www');
            chgrp($dir, 'www');
        }
        
        // 写入文件
        if (file_put_contents($dest, $binary_data)) {
            return $image_path;
        }
        
        return false;
        
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 将文件转换为base64编码字符串
 * @param string $file_path 文件路径（相对路径或绝对路径）
 * @param bool $include_mime 是否包含MIME类型前缀（例如：data:image/png;base64,）
 * @return string|bool 成功返回base64编码的字符串，失败返回false
 */
function file_to_base64($file_path, $include_mime = true) {
    try {
        // 处理相对路径
        if (strpos($file_path, '/') === 0 || strpos($file_path, ':') === false) {
            // 如果是相对路径，拼接为完整路径
            if (strpos($file_path, 'res/') === 0) {
                $file_path = $file_path; // 保持原样
            } else if (strpos($file_path, '/') === 0) {
                $file_path = substr($file_path, 1); // 移除开头的斜杠
            }
        }
        
        // 检查文件是否存在
        if (!file_exists($file_path)) {
            return false;
        }
        
        // 读取文件内容
        $data = file_get_contents($file_path);
        if ($data === false) {
            return false;
        }
        
        // 编码为base64
        $base64 = base64_encode($data);
        
        // 如果需要包含MIME类型前缀
        if ($include_mime) {
            $mime_type = mime_content_type($file_path);
            return 'data:' . $mime_type . ';base64,' . $base64;
        }
        
        return $base64;
    } catch (\Exception $e) {
        return false;
    }
}

function lineart_image_sort($image_list){
    if(empty($image_list)){
        return '';
    }
    $image_list = json_decode($image_list,true);
    // 自定义排序，按照cover字段降序排列
    usort($image_list, function($a, $b) {
        // 如果cover不存在，默认为0
        $a_cover = isset($a['cover']) ? $a['cover'] : 0;
        $b_cover = isset($b['cover']) ? $b['cover'] : 0;
        
        // 降序排列，所以b比较a
        return $b_cover - $a_cover;
    });
    return $image_list;
}
/**
 * 自定义日志记录函数
 * @param mixed $message 日志消息(字符串或数组等)
 * @param string $level 日志级别(info, error, debug等)
 * @param string $file 日志文件名(不包含路径)
 * @param string $log_dir 日志目录,默认为runtime/log
 * @return bool 是否成功写入日志
 */
function custom_log($message, $level = 'info', $file = 'app.log', $log_dir = '') {
    // 设置默认日志目录
    if (empty($log_dir)) {
        $log_dir = RUNTIME_PATH . 'log';
    }
    
    // 确保日志目录存在
    if (!is_dir($log_dir)) {
        if (!mkdir($log_dir, 0755, true)) {
            return false;
        }
    }
    
    // 构建完整日志文件路径
    $log_path = rtrim($log_dir, '/') . '/' . $file;
    
    // 格式化日期时间
    $now = date('Y-m-d H:i:s');
    
    // 处理不同类型的消息
    if (!is_string($message)) {
        $message = var_export($message, true);
    }
    
    // 构建日志内容
    $log_content = "[{$now}] [{$level}] {$message}" . PHP_EOL;
    
    // 写入日志文件
    return error_log($log_content, 3, $log_path);
}

function volcengine_request($action, $version, $body)
{
    $Host = "visual.volcengineapi.com";
    $ContentType = "application/json";
    $Service = "cv";
    $Region = "cn-north-1";
    $credential = [
        'accessKeyId' => Config::get('volcengine.ak'),
        'secretKeyId' => Config::get('volcengine.sk'),
        'service' => $Service,
        'region' => $Region,
    ];
    $header = [];
    $query = [];
    // 初始化签名结构体
    $query = array_merge($query, [
        'Action' => $action,
        'Version' => $version
    ]);
    ksort($query);
    $requestParam = [
        // body是http请求需要的原生body
        'body' => $body,
        'host' => $Host,
        'path' => '/',
        'method' => 'POST',
        'contentType' => $ContentType,
        'date' => gmdate('Ymd\THis\Z'),
        'query' => $query
    ];
    // 第三步：接下来开始计算签名。在计算签名前，先准备好用于接收签算结果的 signResult 变量，并设置一些参数。
    // 初始化签名结果的结构体
    $xDate = $requestParam['date'];
    $shortXDate = substr($xDate, 0, 8);
    $xContentSha256 = hash('sha256', $requestParam['body']);
    $signResult = [
        'Host' => $requestParam['host'],
        'X-Content-Sha256' => $xContentSha256,
        'X-Date' => $xDate,
        'Content-Type' => $requestParam['contentType']
    ];
    // 第四步：计算 Signature 签名。
    $signedHeaderStr = join(';', ['content-type', 'host', 'x-content-sha256', 'x-date']);
    $canonicalRequestStr = join("\n", [
        $requestParam['method'],
        $requestParam['path'],
        http_build_query($requestParam['query']),
        join("\n", ['content-type:'. $requestParam['contentType'], 'host:'. $requestParam['host'], 'x-content-sha256:'. $xContentSha256, 'x-date:'. $xDate]),
        '',
        $signedHeaderStr,
        $xContentSha256
    ]);
    $hashedCanonicalRequest = hash("sha256", $canonicalRequestStr);
    $credentialScope = join('/', [$shortXDate, $credential['region'], $credential['service'], 'request']);
    $stringToSign = join("\n", ['HMAC-SHA256', $xDate, $credentialScope, $hashedCanonicalRequest]);
    $kDate = hash_hmac("sha256", $shortXDate, $credential['secretKeyId'], true);
    $kRegion = hash_hmac("sha256", $credential['region'], $kDate, true);
    $kService = hash_hmac("sha256", $credential['service'], $kRegion, true);
    $kSigning = hash_hmac("sha256", 'request', $kService, true);
    $signature = hash_hmac("sha256", $stringToSign, $kSigning);
    $signResult['Authorization'] = sprintf("HMAC-SHA256 Credential=%s, SignedHeaders=%s, Signature=%s", $credential['accessKeyId']. '/'. $credentialScope, $signedHeaderStr, $signature);
    $header = array_merge($header, $signResult);
    // 第五步：将 Signature 签名写入 HTTP Header 中，并发送 HTTP 请求。
    $client = new Client([
        'base_uri' => 'https://'. $requestParam['host'],
        'timeout' => 120.0,
    ]);

    $response = $client->request('POST', 'https://'. $requestParam['host']. $requestParam['path'], [
        'headers' => $header,
        'query' => $requestParam['query'],
        'body' => $requestParam['body']
    ]);
    
    $responseContent = $response->getBody()->getContents();
    // 转换 \u0026 为 &
    $responseContent = str_replace('\u0026', '&', $responseContent);
    return $responseContent;
}

/**
 * 下载远程文件到本地
 * @param string $url 远程文件URL
 * @param string $format 文件格式(如 .jpg, .png)
 * @param string $sub_dir 子目录(可选)
 * @return array ['success'=>bool, 'message'=>string, 'path'=>string]
 */
function download_remote_file($url, $format = '.jpg', $sub_dir = '') {
    try {
        // 初始化CURL
        $ch = curl_init();
        
        // 设置CURL选项
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        
        // 执行下载
        $file_content = curl_exec($ch);
        
        // 检查是否有错误
        if (curl_errno($ch)) {
            throw new \Exception('下载失败: ' . curl_error($ch));
        }
        
        // 获取HTTP状态码
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($http_code != 200) {
            throw new \Exception('下载失败: HTTP状态码 ' . $http_code);
        }
        
        // 关闭CURL
        curl_close($ch);
        
        // 生成唯一文件名
        $filename = uniqid() . $format;
        
        // 构建保存路径
        $base_dir = 'res';
        $date_path = date('Y').'/'.date('m').'/'.date('d');
        $save_path = $base_dir . '/' . $date_path;
        
        // 如果指定了子目录，添加到路径中
        if (!empty($sub_dir)) {
            $save_path .= '/' . trim($sub_dir, '/');
        }
        
        // 确保目录存在
        if (!is_dir($save_path)) {
            if (!mkdir($save_path, 0777, true)) {
                throw new \Exception('创建目录失败');
            }
            chown($save_path, 'www');
            chgrp($save_path, 'www');
        }
        
        // 完整的文件路径
        $file_path = $save_path . '/' . $filename;
        
        // 保存文件
        if (file_put_contents($file_path, $file_content) === false) {
            throw new \Exception('保存文件失败');
        }
        
        // 设置文件权限
        chmod($file_path, 0644);
        
        return [
            'success' => true,
            'message' => '下载成功',
            'path' => str_replace($base_dir, '', $file_path) // 返回相对路径
        ];
        
    } catch (\Exception $e) {
        // 记录错误日志
        custom_log('下载远程文件失败: ' . $e->getMessage() . ' URL: ' . $url, 'error');
        
        return [
            'success' => false,
            'message' => $e->getMessage(),
            'path' => ''
        ];
    }
}

/**
 * 检测字符串是否包含英文字母
 * @param string $text 需要检测的文本
 * @return boolean 如果包含英文字母返回true，否则返回false
 */
function is_english($text) {
    // 检查文本中是否包含至少一个英文字母(a-z或A-Z)
    return preg_match('/[a-zA-Z]/', $text) === 1;
}

// $postdata 是传输的数据，数组格式
function curl_post( $url, $postdata ,$cookies = '') {
    
    $header = array(
    'Content-Type: application/json;charset=UTF-8'
    );
    
    //初始化
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //设置获取的信息以文件流的形式返回，而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    // 超时设置
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    
    // 超时设置，以毫秒为单位
    // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
    
    // 设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE );
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE );
    
    //设置post方式提交
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
    // curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);//发送cookie文件
    // curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);//写入cookie到文件
    curl_setopt($curl, CURLOPT_COOKIE, $cookies);
    //执行命令
    $data = curl_exec($curl);

    
    // 显示错误信息
    if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
    } else {
        // 打印返回的内容
        curl_close($curl);
        return $data;
    }
}

/**
 * 过滤字符串中的数字、标点符号、特殊字符和空格
 * 只保留字母和中文等文字字符
 * 
 * @param string $str 需要过滤的字符串
 * @return string 过滤后的字符串
 */
function filter_non_text_chars($str) {
    if (empty($str)) {
        return '';
    }
    
    // 使用正则表达式保留字母和中文等文字字符
    // \p{L} 匹配任何字母字符（包括各种语言的字母）
    // \p{Han} 匹配中文汉字
    // u 修饰符用于支持UTF-8编码
    $str =  preg_replace('/[^\p{L}\p{Han}]/u', '', $str);
    $str = str_replace(['【','】'], '', $str);
    return $str;
}

function download($url,$retry=3,$header = []){
    if (empty($url)){
        return '';
    } 
    $format_pos = strrpos($url,'.');
    $format = substr($url, $format_pos,4);

    $filename = crc32($url) .$format;
    $base_dir = 'res';
    $file_name = '/'.date('Y').'/'.date('m').'/'.date('d').'/'.$filename;
    $dest = $base_dir . $file_name;
    if (file_exists($dest)){
        return $file_name;
    }
    $dir = dirname($dest);
    if (!is_dir($dir)) {
        mkdir($dir,0777,true);
    }
    $context = stream_context_create( array(
      'http'=>array(
        'timeout' => 5,
        'method'=>"GET",
        'header'=>implode('\r\n', $header),

      )
    ));
    for ($i=1; $i <= $retry; $i++) { 
        try{
            // echo "download ...{$url}\n";
            $handle = fopen($url, "rb", false, $context);
            $contents = stream_get_contents($handle);
            fclose($handle);
            break;
        }catch(\Exception $e){
            echo "download error {$url} retry {$i}\n";
        }
        throw new \Exception("download error {$url} retry {$i}");
    }
    
    $whandle = fopen($dest, 'wb');
    fwrite($whandle, $contents);
    fclose($whandle);
    return $file_name;
}
/**
 * 提取字符串中的第二个完整JSON串
 * @param string $string 需要提取JSON的字符串
 * @return string|null 成功返回第二个JSON字符串，失败返回null
 */
function extract_first_json($string) {
    if (empty($string)) {
        return null;
    }
    
    // 记录找到的JSON数量
    $json_count = 0;
    $current_position = 0;
    
    while ($current_position < strlen($string)) {
        // 在当前位置之后查找可能的JSON起始位置（{或[）
        $start_curly = strpos($string, '{', $current_position);
        $start_square = strpos($string, '[', $current_position);
        
        // 确定JSON起始位置
        if ($start_curly === false && $start_square === false) {
            return null; // 未找到更多可能的JSON开始标记
        }
        
        // 确定实际的起始位置和对应的结束字符
        if ($start_curly === false) {
            $start = $start_square;
            $start_char = '[';
            $end_char = ']';
        } elseif ($start_square === false) {
            $start = $start_curly;
            $start_char = '{';
            $end_char = '}';
        } else {
            // 两种开始标记都存在，选择较早出现的
            $start = min($start_curly, $start_square);
            $start_char = ($start == $start_curly) ? '{' : '[';
            $end_char = ($start == $start_curly) ? '}' : ']';
        }
        
        // 提取可能的JSON子串
        $sub_str = substr($string, $start);
        
        // 使用栈来匹配括号，确保提取完整的JSON
        $stack = [];
        $position = 0;
        $in_string = false;
        $escape = false;
        $valid_json = false;
        
        for ($i = 0; $i < strlen($sub_str); $i++) {
            $char = $sub_str[$i];
            
            // 处理字符串内的特殊字符
            if ($in_string) {
                if ($escape) {
                    $escape = false;
                    continue;
                }
                
                if ($char === '\\') {
                    $escape = true;
                    continue;
                }
                
                if ($char === '"') {
                    $in_string = false;
                }
                
                continue;
            }
            
            // 处理字符串开始
            if ($char === '"') {
                $in_string = true;
                continue;
            }
            
            // 处理括号匹配
            if ($char === '{' || $char === '[') {
                array_push($stack, $char);
            } elseif ($char === '}') {
                if (end($stack) === '{') {
                    array_pop($stack);
                    if (empty($stack)) {
                        $position = $i;
                        $valid_json = true;
                        break;
                    }
                } else {
                    // 括号不匹配，非有效JSON
                    $valid_json = false;
                    break;
                }
            } elseif ($char === ']') {
                if (end($stack) === '[') {
                    array_pop($stack);
                    if (empty($stack)) {
                        $position = $i;
                        $valid_json = true;
                        break;
                    }
                } else {
                    // 括号不匹配，非有效JSON
                    $valid_json = false;
                    break;
                }
            }
        }
        
        // 如果栈不为空，说明括号不匹配，非有效JSON
        if (!empty($stack)) {
            $valid_json = false;
        }
        
        if ($valid_json) {
            // 找到了一个有效的JSON
            $json_count++;
            
            // 提取当前JSON字符串
            $json_str = substr($sub_str, 0, $position + 1);
            
            // 如果是第二个JSON，返回它
            if ($json_count == 2) {
                return $json_str;
            }
            
            // 更新当前位置到当前JSON之后
            $current_position = $start + $position + 1;
        } else {
            // 当前起始位置没有找到有效JSON，继续从下一个位置寻找
            $current_position = $start + 1;
        }
    }
    
    // 如果没有找到第二个JSON，返回null
    return null;
}